// plugin_manager.h
#ifndef PLUGIN_MANAGER_H
#define PLUGIN_MANAGER_H

#include <stdbool.h>
#include "mpack/mpack.h" // <--- 包含 MPack 头文件
#include "plugin.h" // 包含插件接口定义 (确保 plugin.h 也包含 mpack.h 或 PluginStartFunc 定义已更新)

// 插件状态枚举类型 (保持不变)
typedef enum {
    PLUGIN_STATE_UNLOADED,
    PLUGIN_STATE_LOADED,
    PLUGIN_STATE_STARTED,
    PLUGIN_STATE_STOPPED
} PluginState;

// 配置信息结构体 (移除，因为配置由插件自行解析)
// typedef struct {
//     int param1;
//     const char* param2;
// } PluginConfig;

// 加载的插件结构体
typedef struct {
    PluginInfo info;      // 插件信息 (来自 get_info)
    PluginHandle handle;    // 插件句柄 (来自 load)
    PluginState state;      // 插件状态
    void* dl_handle;         // dlopen 返回的句柄
    // PluginConfig config;    // <--- 移除旧的通用配置结构体
    mpack_node_t config_node; // <--- 添加字段以存储此插件的配置节点
    int magic_number;     // 用于检测内存覆盖的幻数
} LoadedPlugin;

// 插件管理器结构体
typedef struct {
    char* plugin_dir;   // 插件目录
    char* config_dir; // 配置目录
    LoadedPlugin* plugins; // 插件数组
    int plugin_count;   // 插件数量
    int plugin_capacity; // 插件容量

    // --- MPack 树和缓冲区，用于持久化配置数据 ---
    mpack_tree_t config_tree;
    char* config_buffer; // 指向存储 config.mp 内容的缓冲区
    size_t config_buffer_size;
    bool tree_initialized; // 标记树是否已初始化
    // ------------------------------------------

} PluginManager;

// 创建插件管理器
PluginManager* create_plugin_manager(const char* plugin_dir, const char* config_dir);

// 销毁插件管理器
void destroy_plugin_manager(PluginManager* manager);

// 加载插件 (内部使用，或保持公开)
PluginHandle load_plugin(PluginManager* manager, const char* plugin_name, mpack_node_t config_node); // <--- 添加 config_node 参数

// 卸载插件
bool unload_plugin(PluginManager* manager, PluginHandle handle); // <--- 返回 bool 表示成功与否

// 启动插件
bool start_plugin(PluginManager* manager, PluginHandle handle);

// 停止插件
void stop_plugin(PluginManager* manager, PluginHandle handle);

// 加载插件配置 (移除，不再需要此函数)
// bool load_plugin_config(PluginManager* manager, LoadedPlugin* plugin, const char* config_file);

// 加载主配置文件并初始化插件列表 (内部函数)
// 注意：这个函数现在由 create_plugin_manager 调用，并且负责解析 MPack 树
bool parse_main_config_and_load_plugins(PluginManager* manager, const char* config_path); // <--- 新增或重命名

// 启动所有已加载或已停止的插件
void start_all_plugins(PluginManager* manager);

// 停止所有正在运行的插件
void stop_all_plugins(PluginManager* manager);

#endif // PLUGIN_MANAGER_H
